package api

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"gopkg.in/yaml.v2"
	"gvb-server/config"
	"gvb-server/global"
	"gvb-server/utils"
	"io/fs"
	"io/ioutil"
)

const ConfigFile = "setting.yaml"

// 获取url的名字
type settingUri struct {
	Name string `uri:"name"` // 需要和路由中的 参数一致
}

func (s SiteInfo) GetSiteInfo(c *gin.Context) {
	var cr settingUri
	err := c.ShouldBindUri(&cr)
	if err != nil {
		utils.Fail("", "缺少参数", c)
		return
	}

	switch cr.Name {
	case "qq":
		utils.Success(global.Config.Qq, "", c)

	case "jwt":
		utils.Success(global.Config.Jwt, "", c)

	case "email":
		utils.Success(global.Config.Email, "", c)

	case "qiniu":
		utils.Success(global.Config.QiNiu, "", c)

	case "site":
		utils.Success(global.Config.SiteInfo, "", c)

	default:
		utils.Fail("", "没有对应的配置信息", c)

	}
}

// SetSiteInfo 更新 配置文件 【如果只是提交了个别字段，则会让整个结构体 其他未提交的字段变为空的】 要么就反射来判断是否有空值
func (s SiteInfo) SetSiteInfo(c *gin.Context) {
	var cr settingUri
	err := c.ShouldBindUri(&cr)
	if err != nil {
		utils.Fail("", "缺少参数", c)
		return
	}

	switch cr.Name {
	case "qq":
		var si config.QQ
		err := c.ShouldBindJSON(&si) // 接收数据直接绑定结构体
		if err != nil {
			utils.Fail("", utils.MessageString[utils.ParamsError], c)
			return
		}
		// 初始化后 全局有值，这里给全局 SiteInfo 重新赋值
		global.Config.Qq = si
	case "jwt":
		var si config.Jwt
		err := c.ShouldBindJSON(&si)
		if err != nil {
			utils.Fail("", utils.MessageString[utils.ParamsError], c)
			return
		}
		global.Config.Jwt = si
	case "email":
		var si config.Email
		err := c.ShouldBindJSON(&si)
		if err != nil {
			utils.Fail("", utils.MessageString[utils.ParamsError], c)
			return
		}
		global.Config.Email = si
	case "qiniu":
		var si config.QiNiu
		err := c.ShouldBindJSON(&si)
		if err != nil {
			utils.Fail("", utils.MessageString[utils.ParamsError], c)
			return
		}
		global.Config.QiNiu = si
	case "site":
		var si config.SiteInfo
		err := c.ShouldBindJSON(&si)
		if err != nil {
			utils.Fail("", utils.MessageString[utils.ParamsError], c)
			return
		}
		global.Config.SiteInfo = si
	default:
		utils.Fail("", "没有对应的配置信息", c)
	}

	// 更新全局yaml
	err = updateSiteInfo()
	if err != nil {
		utils.Fail("", utils.MessageString[utils.ParamsError], c)
		return
	}
	utils.Success(nil, "修改成功", c)

	//var si config.SiteInfo
	//
	//fmt.Printf("修改前N： %v\n", si)
	//
	//err := c.ShouldBindJSON(&si) // 接收数据直接绑定结构体
	//
	//// 判断空
	//if si.Addr == "" {
	//	fmt.Printf("空了 %v\n", si.Addr)
	//}
	//
	//fmt.Printf("修改后N： %v\n", si.Addr)
	//
	//if err != nil {
	//	utils.Fail("", utils.MessageString[utils.ParamsError], c)
	//	return
	//}
	//// 初始化后 全局有值，这里给全局 SiteInfo 重新赋值
	//global.Config.SiteInfo = si
	//
	//err = updateSiteInfo()
	//if err != nil {
	//	utils.Fail("", utils.MessageString[utils.ParamsError], c)
	//	return
	//}
	//
	//utils.Success(nil, "修改成功", c)
}

// 刷新全局配置参数，重新写到setting.yaml文件中
func updateSiteInfo() error {
	fmt.Printf("修改前： %v\n", global.Config)
	byteData, err := yaml.Marshal(global.Config) // 结构体转换byte
	if err != nil {
		return err
	}

	err = ioutil.WriteFile(ConfigFile, byteData, fs.ModePerm)

	if err != nil {
		return err
	}

	fmt.Printf("修改后： %v\n", global.Config)
	global.Log.Infof("修改配置文件成功！")
	return err
}
